const path = require('path');
const fs = require('fs');
const Promise = require('./promise');

function read(filepath){
    return new Promise((resolve, reject) => {
        fs.readFile(filepath,'utf8',function(err,data){
            if(err) return reject(err); //加不加return其实一样 因为即使下面还有resolve 但这里已经失败了 就不会再改变状态 和发布订阅了
            resolve(data);
        });
    });
}

read(path.resolve(__dirname, './name.txt')).then(/* TODO 3.7 这里注册的函数一定是异步执行*/function (data) {
    //↓ 这样就又回到回调地狱里去了
    /*read(data).then(data=>{
        console.log(data);
    })*/

    // TODO 关于then中的return对下一次then的影响:
    // TODO 3.1.1 如果在then接受的参数方法return一个非promise的值，那么这个值会成为下一个then的成功回调所接受的参数
    //      3.1.2 如果then接受的参数方法返回一个成功的promise它也会走外层then的成功回调

    // TODO 3.2.1 如果在then接受的参数方法中抛出一个错误(throw new Error())，那么会走到下一个then的失败回调，它所接受的参数的值就是抛出的错误
    //      3.2.2 如果then接受的方法参数中返回一个失败的promise它也会走外层then的失败回调(return new Promise((resolve,reject)=>{reject('errmessage')}))

    // TODO 3.3.1 遵循上面的原则，即使上一次的then走的是失败回调，但只要没有抛出错误或则返回一个失败态的promise，那么下一个then也会走成功回调
    //      3.3.2 并且如果这个成功回调后面还有then，那么即使这个成功回调没有返回值(其实相当于return undefined了，也就是走成功，函数默认返回值为undefined)，那么下一个then的成功回调也会执行

    // TODO 3.4 then方法返回的都是新的promise

    // return read(path.resolve(__dirname, data.trim()));
    /* TODO 3.6 有可能resolve的还是一个promise,那么就会继续递归调用resolvePromise方法(内部方法)，直到resolve的是个一个普通值(或则这个promise rejected了 那么promiseX就会转成失败态 下一个then走失败回调) */
    return new Promise((resolve,reject)=>{ //假设这个返回的promise叫promiseX
        resolve(read(path.resolve(__dirname, data.trim())));
    });
}).then((data)=>{
    console.log('成功',data)
    //return
},(reason)=>{
    console.log('失败',reason)
})/*.catch((err)=>{ // 等同于 then(undefined,err=>{}) 就是一个then的别名 没有成功的then
    console.log('err', err);
}).then(data=>{
    console.log('第3个成功回调')
})*/
